package com.halfsword.creativecraft.entity.custom;

import com.halfsword.creativecraft.entity.ai.NothingAttackGoal;
import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.EntityDataSerializer;
import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.*;
import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.ai.goal.*;
import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal;
import net.minecraft.world.entity.monster.Zombie;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.Nullable;

/**
 * 自定义实体类 - NothingEntity
 *
 * <p>由 DeepSeek 提供详细注释：
 * 此类定义了一个自定义的Minecraft实体，具有特定的属性和行为。
 * 使用常量定义实体属性值，提高代码可维护性和可读性。</p>
 */
public class NothingEntity extends PathfinderMob {
    private static final EntityDataAccessor<Boolean> ATTACKING =
            SynchedEntityData.defineId(NothingEntity.class, EntityDataSerializers.BOOLEAN);

    // ================ 实体属性常量 ================
    // DeepSeek 注释：这些常量定义了实体的核心属性值
    // 使用 public static final 确保全局可访问且不可修改

    /** 最大生命值属性常量 */
    public static final double MAX_HEALTH = 99D;

    /** 移动速度属性常量（单位：米/秒） */
    public static final double MOVEMENT_SPEED = 0.525D;

    /** 护甲韧性属性常量 */
    public static final float ARMOR_TOUGHNESS = 2.75f;

    /** 攻击击退强度属性常量 */
    public static final float ATTACK_KNOCKBACK = 4.75f;

    /** 攻击伤害值属性常量 */
    public static final float ATTACK_DAMAGE = 9.75f;

    /** 跟随/攻击范围属性常量（单位：方块） */
    public static final double FOLLOW_RANGE = 29D;

    // ================ 构造函数 ================
    /**
     * 实体构造函数
     *
     * @param entityType 实体类型
     * @param level 实体所在的世界
     *
     * <p>DeepSeek 注释：调用父类构造函数初始化实体</p>
     */
    public NothingEntity(EntityType<? extends PathfinderMob> entityType, Level level) {
        super(entityType, level);
    }

    // ================ 动画相关 ================
    /** 空闲动画状态 */
    public static AnimationState idleAnimationState = new AnimationState();

    /** 空闲动画超时计数器 */
    private int idleAnimationTimeOut = 0;
    /** 攻击动画状态 */
    public static AnimationState attackAnimationState = new AnimationState();

    /** 攻击动画超时计数器 */
    public int attackAnimationTimeOut = 0;
    public void setAttacking (boolean attacking) {
        this.entityData.set(ATTACKING,attacking);
    }
    public boolean isAttacking() {
        return this.entityData.get(ATTACKING);
    }

    @Override
    protected void defineSynchedData() {
        super.defineSynchedData();

        this.entityData.define(ATTACKING,false);

    }

    /**
     * 每帧更新实体状态
     *
     * <p>DeepSeek 注释：
     * - 调用父类tick()处理基础逻辑
     * - 客户端侧设置动画状态</p>
     */
    @Override
    public void tick() {
        super.tick();
        if (this.level().isClientSide()) {
            setupAnimationStates();
        }
    }

    /**
     * 设置动画状态
     *
     * <p>DeepSeek 注释：
     * - 随机生成空闲动画间隔
     * - 启动空闲动画状态</p>
     */
    private void setupAnimationStates() {
        if(this.idleAnimationTimeOut <= 0) {
            // 随机生成50-130刻的动画间隔
            this.idleAnimationTimeOut = this.random.nextInt(50) + 80;
            // 启动空闲动画
            this.idleAnimationState.start(this.tickCount);
        } else {
            // 减少动画超时计数器
            --this.idleAnimationTimeOut;
        }
        if (this.isAttacking() && attackAnimationTimeOut<= 0){
            attackAnimationTimeOut =40;
            attackAnimationState.start(this.tickCount);
        } else {
            --this.attackAnimationTimeOut;
        }
        if(!this.isAttacking()) {
            attackAnimationState.stop();
        }
    }

    /**
     * 更新行走动画
     *
     * @param p_268283_ 部分刻度值
     *
     * <p>DeepSeek 注释：
     * - 根据实体姿态计算动画进度
     * - 更新行走动画状态机</p>
     */
    @Override
    protected void updateWalkAnimation(float p_268283_) {
        float f;
        if (this.getPose() == Pose.STANDING) {
            // 站立姿态时计算动画进度
            f = Math.min(p_268283_ * 6F, 1f);
        } else {
            // 其他姿态无行走动画
            f = 0f;
        }
        // 更新行走动画
        this.walkAnimation.update(f, 0.2f);
    }

    // ================ AI目标注册 ================
    /**
     * 注册实体的AI目标
     *
     * <p>DeepSeek 注释：
     * 优先级从0开始（数值越小优先级越高）</p>
     */
    @Override
    protected void registerGoals() {
        // 浮水目标（优先级0）
        this.goalSelector.addGoal(0, new FloatGoal(this));

        // 近战攻击目标（优先级1）
        this.goalSelector.addGoal(1, new NothingAttackGoal(this, 1.5D, true));

        // 随机漫步目标（优先级2），避开水域
        this.goalSelector.addGoal(2, new WaterAvoidingRandomStrollGoal(this, 1.50D));

        // 注视玩家目标（优先级3），3方块内
        this.goalSelector.addGoal(3, new LookAtPlayerGoal(this, Player.class, 3f));

        // 随机环顾目标（优先级4）
        this.goalSelector.addGoal(4, new RandomLookAroundGoal(this));

        // 目标选择目标：优先攻击玩家（优先级1）
        this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, true));
        this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Zombie.class, true));



    }

    // ================ 实体属性创建 ================
    /**
     * 创建实体属性构建器
     *
     * @return 配置好的属性构建器
     *
     * <p>DeepSeek 注释：
     * - 使用预定义的常量配置实体属性
     * - 确保生物蛋工具提示能获取一致的属性值</p>
     */
    public static AttributeSupplier.Builder createAttributes() {
        return Mob.createLivingAttributes()
                // 使用常量配置属性
                .add(Attributes.MAX_HEALTH, MAX_HEALTH)
                .add(Attributes.MOVEMENT_SPEED, MOVEMENT_SPEED)
                .add(Attributes.ARMOR_TOUGHNESS, ARMOR_TOUGHNESS)
                .add(Attributes.ATTACK_KNOCKBACK, ATTACK_KNOCKBACK)
                .add(Attributes.ATTACK_DAMAGE, ATTACK_DAMAGE)
                .add(Attributes.FOLLOW_RANGE, FOLLOW_RANGE);
    }

    // ================ 声音事件 ================
    /**
     * 获取环境音效
     *
     * @return 环境音效事件
     */
    @Override
    protected @Nullable SoundEvent getAmbientSound() {
        return SoundEvents.ENDER_PEARL_THROW;
    }

    /**
     * 获取受伤音效
     *
     * @param p_21239_ 伤害源
     * @return 受伤音效事件
     */
    @Override
    protected @Nullable SoundEvent getHurtSound(DamageSource p_21239_) {
        return SoundEvents.ENDERMAN_HURT;
    }

    /**
     * 获取死亡音效
     *
     * @return 死亡音效事件
     */
    @Override
    protected @Nullable SoundEvent getDeathSound() {
        return SoundEvents.SHULKER_DEATH;
    }
}